
struct ListNode {
  int val;
  ListNode *next;
  ListNode() : val(0), next(nullptr) {}
  ListNode(int x) : val(x), next(nullptr) {}
  ListNode(int x, ListNode *next) : val(x), next(next) {}
};

ListNode *reverseList(ListNode *head) {
  ListNode *rList = nullptr;
  while (head != nullptr) {
    int val = head->val;
    rList = new ListNode(val, rList);
    head = head->next;
  }
  return rList;
}